/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productorconsumidor;

/**
 * Clase que encapsula un mensaje, nos permitirá almacenar un mensaje dado un
 * indice, asociado al lugar de donde lo toma, puede ser una tabla de mensajes y
 * nos permite devolverlo, el mensaje en si mismo
 *
 * @author julita
 *
 */
public class CMensaje {

    /**
     * boolean disponible; false cuando no hay mensajes que mostrar true hay
     * mensaje que mostrar
     */
    private String textoMensaje;
    private int numMensaje;
    private boolean disponible; // false cuando no hay mensajes que mostrar
    // true hay algún mensaje a mostrar    

    public CMensaje() {
        disponible = false; //no hay ningún mensaje que mostrar
    }

    /**
     * Nos permitirá guardar un mensaje nuevo.
     * Este método lo invoca un hilo   *** Productor ***
     *
     * @param msj
     */
    public synchronized void almacenar(int msj) {
        while (disponible) { //******Condición para esperar
            //el último mensaje aún no ha sido mostrado
            try {
                //el último mensaje aún no ha sido mostrado
                wait(); // el hilo se pone a dormir y cede el monitor
            } catch (InterruptedException ex) {
            }
        }
        numMensaje = msj;
        //podemos suponer que aquí vendría el código necesario para buscar
        //un mensaje  en una tabla de mensajes o base de datos.
        //de tal forma que se obtiene un mensaje, dado el número del mismo
        textoMensaje = "mensaje";

        disponible = true;  // *****para que no pueda entrar otro productor
        notifyAll();  //*****para despertar otros consumidores
    }

    /**
     * el método que invoca obtener es un hilo **** Consumidor ****
     *
     * @return el mensaje almacenado
     */
    public synchronized String obtener() {
        while (!disponible) { // condición para esperar
            try {
                //No hay mensaje
                wait();
            } catch (InterruptedException ex) {
                System.out.println("Saltó la excepción " + ex.getMessage() + "en obtener");
            }
        }
        disponible = false; //para que no pueda entrar otro Consumidor
        notifyAll();        //para despertar otros productores

        //darle formato, devolver el mensaje como se requiera
        String mensaje = textoMensaje + " #" + numMensaje;
        return mensaje;
    }
}
